// 拓扑排序模版（牛客）
// 邻接表建图（动态方式）
// 测试链接 : https://www.nowcoder.com/practice/88f7e156ca7d43a1a535f619cd3f495c
// 提交以下所有代码，可以直接通过

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

const int MAXN = 200001; // 点的最大数量
const int MAXM = 200001; // 边的最大数量
int n; // 点的数量
int m; // 边的数量

// 链式前向星建图 
int head[MAXN];
int next[MAXM];
int to[MAXM];
int cnt = 1; // 边号

int q[MAXN]; // 拓扑排序用到的队列
int indegree[MAXN]; // 拓扑排序用到的入度表
int ret[MAXN]; // 收集拓扑排序的结果
int l, r;

// 初始化
void build(int n)
{
    cnt = 1;
    fill(head + 1, head + n + 1, 0);
    fill(indegree + 1, indegree + n + 1, 0);
}

// 用链式前向星建图
void addEdge(int f, int t)
{
    ::next[cnt] = head[f];
    to[cnt] = t;
    head[f] = cnt++; 
}

// 有拓扑排序返回 true，没有拓扑排序返回 false
bool topoSort()
{
    l = r = 0;
    for(int i = 1; i <= n; ++i) if(!indegree[i]) q[r++] = i;
    
    int fill = 0; 
    while(l < r)
    {
        int x = q[l++];
        ret[fill++] = x;
        // 用链式前向星的方式，遍历 x 的相邻节点
        for(int ei = head[x]; ei != 0; ei = ::next[ei])
        {
            if(--indegree[to[ei]] == 0)
            {
                q[r++] = to[ei];
            }
        }
    }
    return fill == n;
}

int main() 
{   
    cin >> n >> m;
    for(int i = 0; i < m; ++i)
    {
        int from, to;
        cin >> from >> to;
        addEdge(from, to);
        ++indegree[to];
    }
    if(!topoSort())
    {
        cout << "-1" << endl;
    }
    else
    {
        for(int i = 0; i < n - 1; ++i)
        {
            cout << ret[i] << " ";
        }
        cout << ret[n - 1] << endl;
    }
    return 0;
}